/*
 * Copyright 2002-2019 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.context.annotation;

import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.core.type.AnnotationMetadata;
/**
 * 该接口用于实现当处理@{@link Configuration}类时注册额外的bean定义。
 * 当希望或需要在bean定义级别（而不是{@code @Bean}方法/实例级别）操作时，这非常有用。
 *
 * <p>除了{@code @Configuration}和{@link ImportSelector}，这种类型的类可以提供给@{@link Import}注解（或者也可以从一个{@code ImportSelector}返回）。
 *
 * <p>一个{@link ImportBeanDefinitionRegistrar}实现可以实现以下任何{@link org.springframework.beans.factory.Aware Aware}接口，
 * 并且它们各自的方法将在{@link #registerBeanDefinitions}调用之前被调用：
 * <ul>
 * <li>{@link org.springframework.context.EnvironmentAware EnvironmentAware}</li>
 * <li>{@link org.springframework.beans.factory.BeanFactoryAware BeanFactoryAware}</li>
 * <li>{@link org.springframework.beans.factory.BeanClassLoaderAware BeanClassLoaderAware}</li>
 * <li>{@link org.springframework.context.ResourceLoaderAware ResourceLoaderAware}</li>
 * </ul>
 *
 * <p>或者，该类可以提供一个具有一个或多个以下支持的参数类型的单个构造函数：
 * <ul>
 * <li>{@link org.springframework.core.env.Environment Environment}</li>
 * <li>{@link org.springframework.beans.factory.BeanFactory BeanFactory}</li>
 * <li>{@link java.lang.ClassLoader ClassLoader}</li>
 * <li>{@link org.springframework.core.io.ResourceLoader ResourceLoader}</li>
 * </ul>
 *
 * <p>请参见实现和相关单元测试以了解用法示例。
 *
 * @author Chris Beams
 * @author Juergen Hoeller
 * @since 3.1
 * @see Import
 * @see ImportSelector
 * @see Configuration
 */
public interface ImportBeanDefinitionRegistrar {

    /**
     * 根据导入的{@code @Configuration}类的给定注解元数据，必要时注册bean定义。
     * <p>注意，由于与{@code @Configuration}类处理相关的生命周期约束，因此这里不得注册{@link BeanDefinitionRegistryPostProcessor}类型。
     * <p>默认实现委托给{@link #registerBeanDefinitions(AnnotationMetadata, BeanDefinitionRegistry)}。
     * @param importingClassMetadata 导入类的注解元数据
     * @param registry 当前的bean定义注册表
     * @param importBeanNameGenerator 导入bean的命名策略生成器，默认为{@link ConfigurationClassPostProcessor#IMPORT_BEAN_NAME_GENERATOR}，
     *                                或者如果设置了{@link ConfigurationClassPostProcessor#setBeanNameGenerator}，则为用户提供的策略。
     *                                在后一种情况下，传递的策略将与包含的应用上下文中组件扫描使用的策略相同（否则，默认的组件扫描命名策略为{@link AnnotationBeanNameGenerator#INSTANCE}）。
     * @since 5.2
     * @see ConfigurationClassPostProcessor#IMPORT_BEAN_NAME_GENERATOR
     * @see ConfigurationClassPostProcessor#setBeanNameGenerator
     */
    default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry,
                                         BeanNameGenerator importBeanNameGenerator) {

        registerBeanDefinitions(importingClassMetadata, registry);
    }

    /**
     * 根据导入的{@code @Configuration}类的给定注解元数据，必要时注册bean定义。
     * <p>注意，由于与{@code @Configuration}类处理相关的生命周期约束，因此这里不得注册{@link BeanDefinitionRegistryPostProcessor}类型。
     * <p>默认实现为空。
     * @param importingClassMetadata 导入类的注解元数据
     * @param registry 当前的bean定义注册表
     */
    default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
    }

}

